package cn.promonkey.api.menu.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.promonkey.api.menu.entity.Menu;
import cn.promonkey.api.menu.mapper.MenuMapper;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Service;

/** @author ninelock-ai */
@Service
public class MenuService extends ServiceImpl<MenuMapper, Menu> {
	
    public List<Menu> getTreeList(Long systemId) {

        QueryWrapper<Menu> queryWrapper = new QueryWrapper<Menu>();
        queryWrapper.eq("system_id", systemId);
        // 取得所有数据
        List<Menu> list = this.list(queryWrapper);
        // 取得顶层节点
        List<Menu> resultList = new ArrayList<Menu>();

        Map<Object ,Menu> treeMap = new HashMap<>();
        
        for(int i = 0;i<list.size() && !list.isEmpty();i++){
            treeMap.put(list.get(i).getMenuId(),list.get(i));// 把所有的数据都放到map中
        }

        // 遍历map得到顶层节点（游离节点也算作顶层节点）
        for(int i =0;i<list.size();i++){
            if(!treeMap.containsKey(list.get(i).getParentId())){
                resultList.add(list.get(i));
            }
        }
        for(int i =0 ;i<list.size()&& !list.isEmpty();i++){
            // 数据库中，若一个元素有子节点，那么，该元素的id为子节点的父id
            //treeMap.get(tbCategories.get(i).getParentId()); // 从map集合中找到父节点
            Menu category = (Menu)treeMap.get(list.get(i).getParentId());
            if(category!=null ){ // 不等于null，也就意味着有父节点
                // 有了父节点，要判断父节点下存贮字节点的集合是否存在，然后将子节点放入
                if(category.getChildList() == null){
                    // 判断一个集合是否被创建用null：表示结合还没有被分配内存空间(即还没有被创建)，内存大小自然为null
                    // 用集合的size判断集合中是否有元素，为0，没有元素（集合已经被创建），
                    category.setChildList(new ArrayList<Menu>());
                }
                category.getChildList().add(list.get(i)); // 添加到父节点的ChildList集合下

                treeMap.put(list.get(i).getParentId(),category);  // 把放好的数据放回到map中
            }

        }

        return resultList;
    }
	
	
}
